home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / dict / _bb_tree.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  2.0 KB  |  85 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  _bb_tree.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16. #include <LEDA/impl/bb_tree.h>
  17.  
  18.  
  19. void bb_tree::rebal(bb_tree_item v, int delta)
  20. {
  21.   while ( v != root() )
  22.   { 
  23.     bb_tree_item u = v->parent;
  24.     bb_tree_item l = u->child[left];
  25.     bb_tree_item r = u->child[right];
  26.  
  27.     int bu  = u->get_bal() + delta;      // increase/decrease weight of u
  28.     int bl  = l->get_bal();
  29.     int br  = r->get_bal();
  30.  
  31.     u->set_bal(bu);
  32.  
  33.     if (64*bl < bu*alpha)
  34.        { int brl = r->child[left]->get_bal();
  35.          if (64*brl <=  d * br) 
  36.             { rotation(u,r,right);
  37.               r->set_bal(bu);
  38.               u->set_bal(bl + brl);
  39.               v = r;
  40.              }
  41.          else 
  42.             { bb_tree_item w = r->child[left];
  43.               int bwl = w->child[left]->get_bal();
  44.               double_rotation(u,r,w,right);
  45.               w->set_bal(bu);
  46.               u->set_bal(bl + bwl);
  47.               r->set_bal(br - bwl);
  48.               v = w;
  49.              }
  50.         }
  51.     else 
  52.        if (64*br < bu*alpha) 
  53.        { int bll = l->child[left]->get_bal();
  54.          if (64*bll >  d * bl) 
  55.               { rotation(u,l,left);
  56.                 l->set_bal(bu);
  57.                 u->set_bal(bu - bll);
  58.                 v = l;
  59.                }
  60.        else 
  61.               { bb_tree_item w = l->child[right];
  62.                 int bwr = w->child[right]->get_bal();
  63.                 double_rotation(u,l,w,left);
  64.                 w->set_bal(bu);
  65.                 u->set_bal(br + bwr);
  66.                 l->set_bal(bl - bwr);
  67.                 v = w;
  68.                }
  69.         }
  70.  
  71.         else v = u;
  72.        
  73.    }
  74.  
  75. }
  76.  
  77.  
  78.  
  79. void bb_tree::insert_rebal(bb_tree_item v) { rebal(v,1); }
  80.  
  81. void bb_tree::del_rebal(bb_tree_item v, bb_tree_item) { rebal(v,-1); }
  82.  
  83.  
  84.